home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 26 / AACD 26.iso / AACD / Graphics / sKulpt / skulpt-src / Ami-Stuff.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-08-30  |  22.1 KB  |  729 lines

  1. #define STRICT
  2.  
  3. // Includes standard Windows
  4. #include <windows.h>
  5. #include <windowsx.h>
  6. #include <time.h>
  7. #include <stdlib.h>
  8. #include <malloc.h>
  9. #include <memory.h>
  10. #include <stdio.h>
  11.  
  12. // Includes D3D
  13. #define  D3D_OVERLOADS
  14. #include <ddraw.h>
  15. #include <d3d.h>
  16. #include <d3dx.h>
  17.  
  18. // Includes utilitaires D3D
  19. #include "d3dmath.h"
  20. #include "d3dutil.h"
  21. #include "D3DEnum.h"
  22.  
  23. // Ids Resources
  24. #include "resource.h"
  25.  
  26. // Constantes
  27. #include "const.h"
  28.  
  29. // Types
  30. #include "types.h"
  31.  
  32. // Variables globales projet
  33. #include "vars.h"
  34.  
  35. // Prototypes fonctions autres modules
  36. #include "proto.h"
  37.  
  38. // Macros
  39. #include "macros.h"
  40.  
  41. // Spécifiques module
  42. #include "libraries/gadtools.h"
  43. #include "menusample.h"
  44.  
  45. #ifdef __PPC__
  46. #include <powerpc/powerpc.h>
  47. #include <clib/powerpc_protos.h>
  48. #endif
  49.  
  50. #ifdef __PPC__
  51. char sVersion[] = "$VER: sKulpt W3D alpha 7 24-Aug-2000 (W3D/PPC) - stephane.guillard@steria.fr";
  52. #else
  53. char sVersion[] = "$VER: sKulpt W3D alpha 7 24-Aug-2000 (W3D/060) - stephane.guillard@steria.fr";
  54. #endif
  55.  
  56. NewWindow NWS2D =
  57. {
  58.     1, 1,
  59.     30, 30,
  60.     0, 1,
  61.     IDCMP_NEWSIZE,  // Seul le newsize est activé à la création, mais ensuite l'IDCMP est modifié pour prise en compte de tous les autres messages
  62.     WFLG_DEPTHGADGET | WFLG_SIZEBBOTTOM | WFLG_DRAGBAR | WFLG_SIZEGADGET | WFLG_SIMPLE_REFRESH,
  63.     NULL,
  64.     NULL,
  65.     NULL,
  66.     NULL,
  67.     NULL,
  68.     20, 20,
  69.     ~0, ~0,
  70.     CUSTOMSCREEN
  71. };
  72.  
  73. NewWindow NWS3D =
  74. {
  75.     1, 1,
  76.     30, 30,
  77.     0, 1,
  78.     IDCMP_VANILLAKEY | IDCMP_NEWSIZE | IDCMP_REFRESHWINDOW | IDCMP_MENUPICK,
  79.     WFLG_DEPTHGADGET | WFLG_SIZEBBOTTOM | WFLG_DRAGBAR | WFLG_SIZEGADGET | WFLG_SIMPLE_REFRESH,
  80.     NULL,
  81.     NULL,
  82.     NULL,
  83.     NULL,
  84.     NULL,
  85.     20, 20,
  86.     ~0, ~0,
  87.     CUSTOMSCREEN
  88. };
  89.  
  90. NewWindow NWSMenu =
  91. {
  92.     1, 1,
  93.     100, 20,
  94.     0, 1,
  95.     IDCMP_VANILLAKEY | IDCMP_CLOSEWINDOW | IDCMP_MENUPICK,
  96.     WFLG_ACTIVATE | WFLG_DEPTHGADGET | WFLG_SIZEBBOTTOM | WFLG_DRAGBAR | WFLG_SIZEGADGET | WFLG_CLOSEGADGET | WFLG_SIMPLE_REFRESH,
  97.     NULL,
  98.     NULL,
  99.     NULL,
  100.     NULL,
  101.     NULL,
  102.     20, 20,
  103.     ~0, ~0,
  104.     CUSTOMSCREEN
  105. };
  106.  
  107. struct Menu *hMenu = NULL;
  108.  
  109. void vWarpInfo(void)
  110. {
  111.     ULONG lRes;
  112.     char cBuf[255];
  113.  
  114.     W3D_Driver **hDriver = W3D_GetDrivers();
  115.  
  116.     while (*hDriver)
  117.     {
  118.         sprintf(cBuf, "Driver [%s] : fmt 0x%lX ", hDriver[0] -> name, hDriver[0] -> formats);
  119.  
  120.         if (hDriver[0] -> swdriver) sprintf(cBuf + strlen(cBuf), "(HEL) ");
  121.         else                        sprintf(cBuf + strlen(cBuf), "(HAL) ");
  122.  
  123.         sprintf(cBuf + strlen(cBuf), "- primitives : ");
  124.         lRes = W3D_QueryDriver(hDriver[0], W3D_Q_DRAW_POINT, W3D_FMT_R5G5B5);
  125.         if (lRes != W3D_NOT_SUPPORTED) sprintf(cBuf + strlen(cBuf), "point ");
  126.  
  127.         lRes = W3D_QueryDriver(hDriver[0], W3D_Q_DRAW_LINE, W3D_FMT_R5G5B5);
  128.         if (lRes != W3D_NOT_SUPPORTED) sprintf(cBuf + strlen(cBuf), "line ");
  129.  
  130.         lRes = W3D_QueryDriver(hDriver[0], W3D_Q_DRAW_TRIANGLE, W3D_FMT_R5G5B5);
  131.         if (lRes != W3D_NOT_SUPPORTED) sprintf(cBuf + strlen(cBuf), "triangle ");
  132.  
  133.         sprintf(cBuf + strlen(cBuf), "- filtres : ");
  134.         lRes = W3D_QueryDriver(hDriver[0], W3D_Q_BILINEARFILTER, W3D_FMT_R5G5B5);
  135.         if (lRes != W3D_NOT_SUPPORTED) sprintf(cBuf + strlen(cBuf), "bilinear ");
  136.  
  137.         lRes = W3D_QueryDriver(hDriver[0], W3D_Q_MMFILTER, W3D_FMT_R5G5B5);
  138.         if (lRes != W3D_NOT_SUPPORTED) sprintf(cBuf + strlen(cBuf), "mipmap");
  139.  
  140.         vTrace(cBuf);
  141.         hDriver++;
  142.     }
  143. }
  144.  
  145. inline int iDispatchIntuiMessage(HWND wGotMsg, IntuiMessage *iMsg)
  146. {
  147.     APTR iAddress   = iMsg -> IAddress;
  148.     register int
  149.         iClass      = iMsg -> Class,
  150.         iCode       = iMsg -> Code;
  151.     register WORD
  152.         wQualifier  = iMsg -> Qualifier,
  153.         wMouseX     = iMsg -> MouseX,
  154.         wMouseY     = iMsg -> MouseY;
  155.  
  156.     ReplyMsg((struct Message *) iMsg);
  157.  
  158.     switch(iClass)
  159.     {
  160.         case IDCMP_VANILLAKEY :
  161.             PostMessage(wGotMsg, WM_CHAR, iCode, 0);
  162.             break;
  163.  
  164.         case IDCMP_NEWSIZE :
  165.             PostMessage(wGotMsg, WM_SIZE, 0, (ULONG) wGotMsg -> Width | ((ULONG) wGotMsg -> Height) << 16);
  166.             break;
  167.  
  168.         case IDCMP_MOUSEMOVE:
  169.             if (!PeekSignal(l2DWinSigMask))
  170.                 PostMessage(wGotMsg, WM_MOUSEMOVE, wQualifier, (ULONG) wMouseX | ((ULONG) wMouseY) << 16);
  171.             break;
  172.  
  173.         case IDCMP_MENUPICK :
  174.             if (iCode != MENUNULL)
  175.                 PostMessage(wGotMsg, WM_COMMAND, (WPARAM) GTMENUITEM_USERDATA(ItemAddress(hMenu, iCode)), (LPARAM) 0);
  176.             break;
  177.  
  178.         case IDCMP_REFRESHWINDOW :
  179.             BeginRefresh(wGotMsg);
  180.             PostMessage(wGotMsg, WM_PAINT, 0, 0);
  181.             EndRefresh(wGotMsg, TRUE);
  182.             break;
  183.  
  184.         case IDCMP_CLOSEWINDOW :
  185.             PostMessage(wGotMsg, WM_CLOSE, 0, 0);
  186.             break;
  187.  
  188.         case IDCMP_MOUSEBUTTONS:
  189.             switch(iCode)
  190.             {
  191.                 case SELECTDOWN:
  192.                     PostMessage(wGotMsg, WM_LBUTTONDOWN, wQualifier, (ULONG) wMouseX | ((ULONG) wMouseY) << 16);
  193.                     break;
  194.  
  195.                 case SELECTUP:
  196.                     PostMessage(wGotMsg, WM_LBUTTONUP, wQualifier, (ULONG) wMouseX | ((ULONG) wMouseY) << 16);
  197.                     break;
  198.             }
  199.             break;
  200.  
  201.         default :
  202.             vTrace("*** E0034 : Message Class %08lX Code %04X Qualif %04X reçu et non traité pour fenêtre %s", iClass, iCode, wQualifier, wGotMsg -> Title);
  203.             break;
  204.     }
  205.     return iClass;
  206. }
  207.  
  208. #define mCleanExit(s, l)    \
  209. {                           \
  210.     vTrace(s);              \
  211.     goto l;                 \
  212. }
  213.  
  214. ULONG lFlags, lModeID, lError;
  215.  
  216. int main(int argc, char **argv)
  217. {
  218.     IntuiMessage *iMsg;
  219.     int iClass;
  220.     void *hVi = NULL;
  221.     ULONG lSigMask, lSigTop, lSigFace, lSigRight, lSig3D, lSigMenu;
  222.     W3D_Double dZdepth = 0.8;
  223.  
  224.     // Mémoriser notre pointeur de tâche
  225.     hApp = FindTask(NULL);
  226.  
  227.     // Ouvrir les librairies non ouvertes par défaut par les stubs Storm
  228.     GadToolsBase   = OpenLibrary((UBYTE *) "gadtools.library",  39L);
  229.     UtilityBase    = OpenLibrary((UBYTE *) "utility.library",   39L);
  230.     AslBase        = OpenLibrary((UBYTE *) "asl.library",       39L);
  231.     AmigaGuideBase = OpenLibrary((UBYTE *) "amigaguide.library",39L);
  232.     DataTypesBase  = OpenLibrary((UBYTE *) "datatypes.library", 39L);
  233.     IconBase       = OpenLibrary((UBYTE *) "icon.library",      39L);
  234.     CyberGfxBase   = OpenLibrary((UBYTE *) "cybergraphics.library", 0L);
  235.     if (!(GadToolsBase && UtilityBase && AslBase && AmigaGuideBase && DataTypesBase && IconBase && CyberGfxBase))
  236.         mCleanExit("*** E0035 : librairie manquante, utilisez SnoopDos pour trouver laquelle", _mce_CloseLibs);
  237.  
  238. #ifndef __PPC__
  239.     Warp3DBase     = OpenLibrary((UBYTE *) "Warp3D.library",    3L);
  240.     if (!Warp3DBase)
  241. #else
  242.     Warp3DPPCBase  = OpenLibrary((UBYTE *) "Warp3DPPC.library", 3L);
  243.     if (!Warp3DPPCBase)
  244. #endif
  245.         mCleanExit("*** E0036 : librairie Warp3D v3 manquante", _mce_CloseLibs);
  246.  
  247.     // Check for availability of drivers
  248.     lFlags = W3D_CheckDriver();
  249.     if (lFlags & W3D_DRIVER_UNAVAILABLE)
  250.         mCleanExit("*** E0037 : pas de driver Warp3D", _mce_CloseLibs);
  251.  
  252.     // Choisir un mode d'écran compatible Warp3D
  253.     lModeID = W3D_RequestModeTags(
  254.         W3D_SMR_TYPE,       W3D_DRIVER_3DHW,
  255.         W3D_SMR_DESTFMT,    ~W3D_FMT_CLUT,
  256.         TAG_DONE);
  257.  
  258.     if (lModeID == INVALID_ID)
  259.         mCleanExit("*** E0038 : pas de mode d'écran valide", _mce_CloseLibs);
  260.  
  261.     // Ouvrir l'écran selon mode demandé
  262.     if (!(hInst = OpenScreenTags(NULL,
  263.                                       SA_DisplayID,          lModeID,
  264.                                  SA_SharePens,          TRUE,
  265.                                  SA_Title,              (ULONG) sVersion + 6,
  266.                                   SA_Draggable,          FALSE,
  267.                                   TAG_DONE)))
  268.         mCleanExit("*** E0039 : ouverture écran", _mce_CloseLibs);
  269.  
  270.     NWS2D.Screen = NWS3D.Screen = NWSMenu.Screen = hInst;
  271.  
  272.     // Créer la structure de menus GadToolz
  273.     hVi     = GetVisualInfo(hInst, TAG_DONE);                                     
  274.     hMenu   = CreateMenus(mNMenu, GTMN_FrontPen, 0, TAG_DONE);
  275.     LayoutMenus(hMenu, hVi, TAG_DONE);
  276.     
  277.     // Allouer les structures du filerequester
  278.     if (!FSInit())
  279.         mCleanExit("*** E0040 : allocation filerequester", _mce_CloseLibsAndScreenAndVI);
  280.  
  281.     // Allouer les structures du gestionnaire de dialogs
  282.     if (!DLGInit("sampler.res"))
  283.         mCleanExit("*** E0048 : initialisation ressources", _mce_CloseLibsAndScreenAndVIAndFS);
  284.  
  285.     // Préparer les gadgets
  286.     if (!bPrepareGadgets())
  287.         mCleanExit("*** E0049 : initialisation gadgets", _mce_CloseLibsAndScreenAndVIAndFSAndDlg);
  288.  
  289.     // Initialiser les tableaux d'objets 3D
  290.     vDeleteObjects();
  291.  
  292.     // Se présenter...
  293.     vLogo();
  294.  
  295.     // Créer la fenêtre de menus, y attacher le menustrip et définr son titre
  296.     PostMessage(hWndMenu = OpenWindow(&NWSMenu), WM_CREATE, 0, 0); SetMenuStrip(hWndMenu, hMenu); SetWindowTitles(hWndMenu, sVersion + 6, (UBYTE *) -1);
  297.  
  298.     // Attacher la console de trace à la fenêtre de menus
  299.     if (!InitConsole(hWndMenu))
  300.         mCleanExit("*** E0047 : initialisation console", _mce_CloseLibsAndScreenAndVIAndFSAndDlgAndGads);
  301.  
  302.     // Créer les fenêtres 2D, leur envoyer un WM_CREATE, leur attacher la menustrip de la fenêtre menu, leur coller un titre
  303.     PostMessage(hWndTop = OpenWindow(&NWS2D), WM_CREATE, 0, 0); LendMenus(hWndTop, hWndMenu); SetWindowTitles(hWndTop, "Vue de dessus", (UBYTE *) -1); SetDrMd(GetDC(hWndTop), JAM1);
  304.     PostMessage(hWndFace = OpenWindow(&NWS2D), WM_CREATE, 0, 0); LendMenus(hWndFace, hWndMenu); SetWindowTitles(hWndFace, "Vue de face", (UBYTE *) -1); SetDrMd(GetDC(hWndFace), JAM1);
  305.     PostMessage(hWndRight = OpenWindow(&NWS2D), WM_CREATE, 0, 0); LendMenus(hWndRight, hWndMenu); SetWindowTitles(hWndRight, "Vue de droite", (UBYTE *) -1); SetDrMd(GetDC(hWndRight), JAM1);
  306.  
  307.     // Créer la fenêtre 3D etc....
  308.     PostMessage(hWndPersp = OpenWindow(&NWS3D), WM_CREATE, 0, 0); LendMenus(hWndPersp, hWndMenu); SetWindowTitles(hWndPersp, "3D incomplète dans cette version", (UBYTE *) -1);
  309.  
  310.     // Laisser Intuition flusher son pipe
  311.     Delay(10);
  312.  
  313.     // Redimensionner les fenêtres (ce qui vide la trace...)
  314.     vRemakeTriview(0L);
  315.  
  316.     // Forcer le rafraichissement complet de la fenêtre 3D
  317.     vForce3DRefresh(XDC_MODE_COMPLET);
  318.  
  319.     // Mettre à jour les checkmarks des menus
  320.     vUpdateMenu();
  321.  
  322.     // Créer le contexte W3D commun aux 3 fenêtres 2D (sans zbuf)
  323.     hW3DContext = W3D_CreateContextTags(&lError,
  324.         W3D_CC_MODEID,      lModeID,
  325.         W3D_CC_BITMAP,      (ULONG) (hInst -> RastPort.BitMap),
  326.         W3D_CC_YOFFSET,     0,
  327.         W3D_CC_DRIVERTYPE,  W3D_DRIVER_BEST,
  328.         W3D_CC_DOUBLEHEIGHT, FALSE,
  329.         W3D_CC_FAST,        TRUE,
  330.         TAG_DONE);
  331.  
  332.     if (!hW3DContext || lError != W3D_SUCCESS)
  333.     {
  334.         switch(lError)
  335.         {
  336.         case W3D_ILLEGALINPUT:
  337.             vTrace("*** E0041 : paramètres CreateContext()");
  338.             break;
  339.         case W3D_NOMEMORY:
  340.             vTrace("*** E0042 : mémoire insuffisante");
  341.             break;
  342.         case W3D_NODRIVER:
  343.             vTrace("*** E0043 : driver invalide");
  344.             break;
  345.         case W3D_UNSUPPORTEDFMT:
  346.             vTrace("*** E0044 : bitmap incompatible Warp3D");
  347.             break;
  348.         case W3D_ILLEGALBITMAP:
  349.             vTrace("*** E0045 : bitmap mal initialisé");
  350.             break;
  351.         default:
  352.             vTrace("*** E0046 : erreur interne");
  353.         }
  354.         goto _mce_CloseLibsAndScreenAndVIAndWindows;
  355.     }
  356.  
  357.     // Set dithering. This will look considerably better on 15 bit displays.
  358.     W3D_SetState(hW3DContext, W3D_DITHERING, W3D_DISABLE);
  359.  
  360.     // Set Gouraud shading state
  361.     W3D_SetState(hW3DContext, W3D_GOURAUD, W3D_DISABLE);
  362.  
  363.     // Activer le clipping
  364.     W3D_SetState(hW3DContext, W3D_SCISSOR, W3D_ENABLE);
  365.  
  366.     // Désactiver le zbuffer
  367.     W3D_SetState(hW3DContext, W3D_ZBUFFERUPDATE, W3D_ENABLE);
  368.     W3D_SetState(hW3DContext, W3D_ZBUFFER, W3D_DISABLE);
  369.  
  370.     // Afficher les propriétés des drivers Warp installés
  371.     vWarpInfo();
  372.  
  373.     // Préparer les matrices world / view / proj
  374.     hrInitWorld(NULL);
  375.  
  376.     // Finaliser la liste des messages broadcastés pour les fenêtres 2D
  377.     ModifyIDCMP(hWndTop, IDCMP_VANILLAKEY | IDCMP_NEWSIZE | IDCMP_MOUSEBUTTONS | IDCMP_MOUSEMOVE | IDCMP_REFRESHWINDOW | IDCMP_MENUPICK);
  378.     ModifyIDCMP(hWndFace, IDCMP_VANILLAKEY | IDCMP_NEWSIZE | IDCMP_MOUSEBUTTONS | IDCMP_MOUSEMOVE | IDCMP_REFRESHWINDOW | IDCMP_MENUPICK);
  379.     ModifyIDCMP(hWndRight, IDCMP_VANILLAKEY | IDCMP_NEWSIZE | IDCMP_MOUSEBUTTONS | IDCMP_MOUSEMOVE | IDCMP_REFRESHWINDOW | IDCMP_MENUPICK);
  380.  
  381.     // Préparer les masques de signaux pour la boucle de messages
  382.     lSigMenu = 1L << hWndMenu -> UserPort -> mp_SigBit;
  383.     lSigTop = 1L << hWndTop -> UserPort -> mp_SigBit;
  384.     lSigFace = 1L << hWndFace -> UserPort -> mp_SigBit;
  385.     lSigRight = 1L << hWndRight -> UserPort -> mp_SigBit;
  386.     lSig3D = 1L << hWndPersp -> UserPort -> mp_SigBit;
  387.     l2DWinSigMask = lSigTop | lSigFace | lSigRight;
  388.  
  389.     // Boucle principale de traitement des messages Intuition
  390.     do
  391.     {
  392.         // Attendre un message sur toutes les fenêtres
  393. #ifdef __PPC__
  394.         lSigMask = WaitPPC(lSigMenu | l2DWinSigMask | lSig3D);
  395. #else
  396.         lSigMask = Wait(lSigMenu | l2DWinSigMask | lSig3D);
  397. #endif
  398.         // Traiter tous les messages dans la file de la fenêtre Menus
  399.         if (lSigMask & lSigMenu)
  400.             while (iMsg = (struct IntuiMessage *) GetMsg(hWndMenu -> UserPort))
  401.                 iClass = iDispatchIntuiMessage(hWndMenu, iMsg);
  402.       
  403.         // Traiter tous les messages dans la file de la fenêtre Vue de dessus
  404.           if (lSigMask & lSigTop)
  405.             while (iMsg = (struct IntuiMessage *) GetMsg(hWndTop -> UserPort))
  406.                 iClass = iDispatchIntuiMessage(hWndTop, iMsg);
  407.  
  408.         // Traiter tous les messages dans la file de la fenêtre Vue de face
  409.         if (lSigMask & lSigFace)
  410.             while (iMsg = (struct IntuiMessage *) GetMsg(hWndFace -> UserPort))
  411.                 iClass = iDispatchIntuiMessage(hWndFace, iMsg);
  412.  
  413.         // Traiter tous les messages dans la file de la fenêtre Vue de droite
  414.         if (lSigMask & lSigRight)
  415.             while (iMsg = (struct IntuiMessage *) GetMsg(hWndRight -> UserPort))
  416.                 iClass = iDispatchIntuiMessage(hWndRight, iMsg);
  417.  
  418.         // Traiter tous les messages dans la file de la fenêtre Vue 3D
  419.         if (lSigMask & lSig3D)
  420.             while (iMsg = (struct IntuiMessage *) GetMsg(hWndPersp -> UserPort))
  421.                 iClass = iDispatchIntuiMessage(hWndPersp, iMsg);
  422.     }
  423.     // Jusqu'à IDCMP_CLOSEWINDOW (qui ne peut venir que de la fenêtre Menus)
  424.     while (iClass != IDCMP_CLOSEWINDOW);
  425.  
  426.     if (hW3DContext) W3D_DestroyContext(hW3DContext);
  427.  
  428. _mce_CloseLibsAndScreenAndVIAndWindows:
  429.     // Libérer les entités allouées par les fenêtres en leur envoyant un WM_DESTROY
  430.     if (hWndTop)    PostMessage(hWndTop,    WM_DESTROY, 0, 0);
  431.     if (hWndFace)   PostMessage(hWndFace,   WM_DESTROY, 0, 0);
  432.     if (hWndRight)  PostMessage(hWndRight,  WM_DESTROY, 0, 0);
  433.     if (hWndPersp)  PostMessage(hWndPersp,  WM_DESTROY, 0, 0);
  434.     if (hWndMenu)   PostMessage(hWndMenu,   WM_DESTROY, 0, 0);
  435.  
  436.     // Détacher la menustrip
  437.     if (hWndTop)    LendMenus(hWndTop, NULL);
  438.     if (hWndFace)   LendMenus(hWndFace, NULL);
  439.     if (hWndRight)  LendMenus(hWndRight, NULL);
  440.     if (hWndPersp)  LendMenus(hWndPersp, NULL);
  441.     if (hWndMenu)   ClearMenuStrip(hWndMenu);
  442.  
  443.     // Refermer la console de trace
  444.     if (hWndMenu)   CloseConsole();
  445.     
  446.     // Fermer les fenêtres
  447.     if (hWndTop)    CloseWindowSafely(hWndTop);
  448.     if (hWndFace)   CloseWindowSafely(hWndFace);
  449.     if (hWndRight)  CloseWindowSafely(hWndRight);
  450.     if (hWndPersp)  CloseWindowSafely(hWndPersp);
  451.     if (hWndMenu)   CloseWindowSafely(hWndMenu);
  452.  
  453. _mce_CloseLibsAndScreenAndVIAndFSAndDlgAndGads:
  454.     // Libérer les gadgets
  455.     vEraseGadgets();
  456.  
  457. _mce_CloseLibsAndScreenAndVIAndFSAndDlg:
  458.     // Libérer les structures File Requester et screenmoderequester et du gestionnaire de console
  459.     DLGClose();
  460. _mce_CloseLibsAndScreenAndVIAndFS:
  461.     FSClose();
  462.  
  463. _mce_CloseLibsAndScreenAndVI:
  464.     // Détruire le menustrip
  465.     FreeMenus(hMenu);
  466.  
  467.     // Libérer le Visual Info Gadtoolz
  468.     FreeVisualInfo(hVi);
  469.  
  470.     // Fermer l'écran s'il s'agit d'un écran custom
  471.     if (lModeID != INVALID_ID)
  472.         CloseScreen(hInst);
  473.  
  474. _mce_CloseLibs:
  475.     // Refermer les librairies
  476.     if (GadToolsBase)   CloseLibrary(GadToolsBase);
  477.     if (UtilityBase)    CloseLibrary(UtilityBase);
  478.     if (AslBase)        CloseLibrary(AslBase);
  479.     if (AmigaGuideBase) CloseLibrary(AmigaGuideBase);
  480.     if (DataTypesBase)  CloseLibrary(DataTypesBase);
  481.     if (IconBase)       CloseLibrary(IconBase);
  482.     if (CyberGfxBase)   CloseLibrary(CyberGfxBase);
  483. #ifndef __PPC__
  484.     if (Warp3DBase)     CloseLibrary(Warp3DBase);
  485. #else
  486.     if (Warp3DPPCBase)  CloseLibrary(Warp3DPPCBase);
  487. #endif
  488.  
  489. _mce_End:
  490. }
  491.  
  492. // Simulation PostMessage Windows : dispatcher le message sur la WindowProc en fonction de hWnd
  493. int PostMessage(HWND hWnd, int iMsg, WPARAM wParam, LPARAM lParam)
  494. {
  495.     if (hWnd ==  hWndTop || hWnd == hWndFace || hWnd == hWndRight)
  496.     {
  497.         lrPlanarWndProc(hWnd, iMsg, wParam, lParam);
  498.         return 0;
  499.     }
  500.  
  501.     if (hWnd ==  hWndPersp)
  502.     {
  503.         lrPerspWndProc(hWnd, iMsg, wParam, lParam);
  504.         return 0;
  505.     }
  506.  
  507.     if (hWnd ==  hWndMenu)
  508.         lrMenuWndProc(hWnd, iMsg, wParam, lParam);
  509.  
  510.     return 0;
  511. }
  512.  
  513. void DestroyWindow(HWND hWnd)
  514. {
  515.     PostMessage(hWnd, WM_DESTROY, 0, 0);
  516. }
  517.  
  518. // Gestion du clipping fenêtres
  519. struct Region *ClipWindow(HWND hWnd, LONG lMinX, LONG lMinY, LONG lMaxX, LONG lMaxY)
  520. {
  521.     struct Region *hRNew;
  522.     struct Rectangle rRect;
  523.  
  524.     rRect.MinX = lMinX;
  525.     rRect.MinY = lMinY;
  526.     rRect.MaxX = lMaxX;
  527.     rRect.MaxY = lMaxY;
  528.  
  529.     hRNew = NewRegion();
  530.     OrRectRegion(hRNew, &rRect);
  531.  
  532.     return InstallClipRegion(hWnd -> WLayer, hRNew);
  533. }
  534.  
  535. void UnclipWindow(HWND hWnd)
  536. {
  537.     register struct Region *hROld;
  538.  
  539.     if (hROld = InstallClipRegion(hWnd -> WLayer, NULL))
  540.         DisposeRegion(hROld);
  541. }
  542.  
  543. struct RastPort *GetDC(HWND hWnd)
  544. {
  545.     return hWnd -> RPort;
  546. }
  547.  
  548. BOOL ExtTextOut(HDC hdc,int X,int Y, int fuOptions, RECT *lprc, char *lpString, int cbCount, int *lpDx)
  549. {
  550.     Move(hdc, X, Y + 24);
  551.     Text(hdc, lpString, cbCount);
  552.     return TRUE;
  553. }
  554.  
  555. BOOL PtInRect(RECT *rRect, POINT pPoint)
  556. {
  557.     if (pPoint.x > rRect -> right)  return FALSE;
  558.     if (pPoint.x < rRect -> left)   return FALSE;
  559.     if (pPoint.y > rRect -> bottom) return FALSE;
  560.     if (pPoint.y < rRect -> top)    return FALSE;
  561.     return TRUE;
  562. }
  563.  
  564. // Récupérer le rectangle complet de la zone client de la fenêtre
  565. void GetClientRect(HWND hWnd, RECT *rRect)
  566. {
  567.     rRect -> left   = hWnd -> BorderLeft;
  568.     rRect -> right  = hWnd -> Width - hWnd -> BorderRight - 1;
  569.     rRect -> top    = hWnd -> BorderTop;
  570.     rRect -> bottom = hWnd -> Height - hWnd -> BorderBottom - 1;
  571. }
  572.  
  573. // Cloner un rectangle (r1 <- r2)
  574. void CopyRect(RECT *rR1, RECT *rR2)
  575. {
  576.     *rR1 = *rR2;
  577. }
  578.  
  579. // Enfler un rectangle
  580. void InflateRect(RECT *rRect, int iX, int iY)
  581. {
  582.     rRect -> left   -= iX;
  583.     rRect -> right  += iX;
  584.     rRect -> top    -= iY;
  585.     rRect -> bottom += iY;
  586. }
  587.  
  588. // Définir un rectangle (x / y / lagreur / hauteur)
  589. void SetRect(RECT *rRect, int x, int y, int w, int h)
  590. {
  591.     rRect -> left   = x;
  592.     rRect -> right  = x + w;
  593.     rRect -> top    = y;
  594.     rRect -> bottom = y + h;
  595. }
  596.  
  597. BOOL bPrepareGadgets(void)
  598. {
  599.     if (!(gAddPoint.hIcon   = GetDiskObjectNew("gfx/BTN_ADD_POINT")))       return FALSE;
  600.     if (!(gCenter.hIcon        = GetDiskObjectNew("gfx/BTN_CENTER")))          return FALSE;
  601.     if (!(gGoDown.hIcon        = GetDiskObjectNew("gfx/BTN_GO_DOWN")))         return FALSE;
  602.     if (!(gGoLeft.hIcon        = GetDiskObjectNew("gfx/BTN_GO_LEFT")))         return FALSE;
  603.     if (!(gGoUp.hIcon        = GetDiskObjectNew("gfx/BTN_GO_UP")))           return FALSE;
  604.     if (!(gGoRight.hIcon    = GetDiskObjectNew("gfx/BTN_GO_RIGHT")))        return FALSE;
  605.     if (!(gGrab.hIcon        = GetDiskObjectNew("gfx/BTN_GRABBER")))         return FALSE;
  606.     if (!(gMakeTri.hIcon    = GetDiskObjectNew("gfx/BTN_MAKE_TRIANGLE")))   return FALSE;
  607.     if (!(gReverse.hIcon    = GetDiskObjectNew("gfx/BTN_REVERSE")))         return FALSE;
  608.     if (!(gRotAnti.hIcon    = GetDiskObjectNew("gfx/BTN_ROTATE_TRIGO")))    return FALSE;
  609.     if (!(gRotClock.hIcon   = GetDiskObjectNew("gfx/BTN_ROTATE_CLOCK")))    return FALSE;
  610.     if (!(gZoomIn.hIcon        = GetDiskObjectNew("gfx/BTN_ZOOM_IN")))         return FALSE;
  611.     if (!(gZoomOut.hIcon    = GetDiskObjectNew("gfx/BTN_ZOOM_OUT")))        return FALSE;
  612.  
  613.     return TRUE;
  614. }
  615.  
  616. void vEraseGadgets(void)
  617. {
  618.     if (gAddPoint.hIcon)FreeDiskObject(gAddPoint.hIcon);
  619.     if (gCenter.hIcon)  FreeDiskObject(gCenter.hIcon);
  620.     if (gGoDown.hIcon)  FreeDiskObject(gGoDown.hIcon);
  621.     if (gGoLeft.hIcon)  FreeDiskObject(gGoLeft.hIcon);
  622.     if (gGoUp.hIcon)    FreeDiskObject(gGoUp.hIcon);
  623.     if (gGoRight.hIcon) FreeDiskObject(gGoRight.hIcon);
  624.     if (gGrab.hIcon)    FreeDiskObject(gGrab.hIcon);
  625.     if (gMakeTri.hIcon) FreeDiskObject(gMakeTri.hIcon);
  626.     if (gReverse.hIcon) FreeDiskObject(gReverse.hIcon);
  627.     if (gRotAnti.hIcon) FreeDiskObject(gRotAnti.hIcon);
  628.     if (gRotClock.hIcon)FreeDiskObject(gRotClock.hIcon);
  629.     if (gZoomIn.hIcon)  FreeDiskObject(gZoomIn.hIcon);
  630.     if (gZoomOut.hIcon) FreeDiskObject(gZoomOut.hIcon);
  631. }
  632.  
  633. HGDIOBJ hAddImage(HWND hWnd, char *sName, int iX, int iY, int iWidth, int iHeight)
  634. {
  635.     HGDIOBJ hObject = NewDTObject(sName,
  636.         DTA_SourceType,        DTST_FILE,
  637.         GA_RelVerify,        TRUE,
  638.           GA_Immediate,       TRUE,
  639.         GA_Left,            iX,
  640.           GA_Top,                iY,
  641.         GA_Width,           iWidth,
  642.         GA_Height,          iHeight,
  643.         ICA_TARGET,            ICTARGET_IDCMP,
  644.         TAG_DONE);
  645.  
  646.     if (!hObject)
  647.         return NULL;
  648.  
  649.     AddDTObject(hWnd, NULL, hObject, -1);
  650.     return hObject;
  651. }
  652.  
  653. void vMoveImage(HWND hWnd, HGDIOBJ hObject, int iX, int iY)
  654. {
  655.     RemoveDTObject(hWnd, hObject);
  656.     SetDTAttrs(hObject, hWnd, NULL,
  657.         GA_Left,            iX,
  658.           GA_Top,                iY,
  659.         TAG_DONE);
  660.     AddDTObject(hWnd, NULL, hObject, -1);
  661. }
  662.  
  663. void vRefreshImage(HWND hWnd, HGDIOBJ hObject)
  664. {
  665.     RefreshDTObjectA(hObject, hWnd, NULL, NULL);
  666. }
  667.  
  668. void vRemoveImage(HWND hWnd, HGDIOBJ hObject)
  669. {
  670.     RemoveDTObject(hWnd, hObject);
  671.     DisposeDTObject(hObject);
  672. }
  673.  
  674. //###############################################################################
  675. // Protos non mappés
  676. BOOL CALLBACK bGlobLightDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  677. {
  678.     return TRUE;
  679. }
  680.  
  681. BOOL CALLBACK bSphereDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  682. {
  683.     return TRUE;
  684. }
  685.  
  686. BOOL CALLBACK bFaceDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  687. {
  688.     return TRUE;
  689. }
  690.  
  691. BOOL CALLBACK bExpandDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  692. {
  693.     return TRUE;
  694. }
  695.  
  696. BOOL CALLBACK bHelixDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  697. {
  698.     return TRUE;
  699. }
  700.  
  701. BOOL CALLBACK bHoleDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  702. {
  703.     return TRUE;
  704. }
  705.  
  706. BOOL CALLBACK bStringDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  707. {
  708.     return TRUE;
  709. }
  710.  
  711. void vAddTextOutline(void)
  712. {
  713. }
  714.  
  715. DWORD GetTickCount(void)
  716. {
  717.     return (DWORD) 0;
  718. }
  719.  
  720. void ShowWindow(HWND hWnd, int iI)
  721. {
  722. }     
  723.  
  724. void PostQuitMessage(int iI)
  725. {
  726. }
  727.  
  728.  
  729.